/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pronostico;

import AlgoritmoPronostico.Reloj;
import beans.Mapa;
import beans.Pedido;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Random;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.jboss.weld.bootstrap.api.Environment;
import packetTracker.PacketTracker;
import pronostico.PolynomialFitter.Polynomial;

/**
 *
 * @author Shadow
 */
public class ManejaArchivos {

    public static boolean leeDatos(String dia, String mes, String anho) {
        BufferedReader r = null;
        try {
            URL rutaca = Pronostico.class.getProtectionDomain().getCodeSource().getLocation();
            String ruta = rutaca.toString().substring(6, rutaca.toString().length()-8) + "files/";
            ruta = ruta.replaceAll("%20", " ");
            ruta += "dat" + anho + mes + dia + ".txt";
            r = new BufferedReader(new FileReader(ruta));
            //String ruta = PacketTracker.getInstancia().getServletContext().getRealPath("") + "/WEB-INF/files/" + "dat" + anho + mes + dia + ".txt";
            //r = new BufferedReader(new FileReader(ruta));
        } catch (FileNotFoundException ex) {
            return false;
        }
        ArrayList<Turno> turnosDia = new ArrayList<>();
        ArrayList<Integer> paqxTurno = new ArrayList<>();
        if (!procesaTurnos(r, turnosDia, paqxTurno)) {
            return false;
        }
        Historico.getInstance().getDias().add(turnosDia);
        Historico.getInstance().getPaquetesxDiaxTurno().add(paqxTurno);
        return true;
    }

    public static boolean procesaTurnos(BufferedReader r, ArrayList<Turno> turnos, ArrayList<Integer> paqxTurno) {
        String line = null;
        String[] toks;
        int x = 0, y = 0, nPaq = 0, idCliente = 0, tiempoEntrega = 0;
        int turnoActual = 0;
        int tiempoTurno = 8 * 60;
        for (int i = 0; i < 3; i++) {
            paqxTurno.add(0);
        }
        Turno turno = new Turno();
        while (true) {
            try {
                line = r.readLine();
            } catch (IOException ex) {
                return false;
            }
            if (line == null || line.length() == 0) {
                turnos.add(turno);
                turnoActual++;
                while (turnoActual < 3) {
                    turnos.add(new Turno());
                }
                break;
            }
            toks = line.split(",");
            String hora = toks[0];
            x = Integer.parseInt(toks[1]);
            y = Integer.parseInt(toks[2]);
            nPaq = Integer.parseInt(toks[3]);
            idCliente = Integer.parseInt(toks[4]);
            tiempoEntrega = Integer.parseInt(toks[5]);
            int horaPedido = Integer.parseInt(hora.substring(0, 2));
            int minutoPedido = Integer.parseInt(hora.substring(3, 5));
            int tiempoPedido = horaPedido * 60 + minutoPedido;
            if (tiempoPedido >= turnoActual * tiempoTurno && tiempoPedido < (turnoActual + 1) * tiempoTurno) {
                procesaTurno(turnoActual, tiempoPedido, tiempoEntrega, nPaq, turnos, turno, paqxTurno);
            } else {
                turnos.add(turno);
                turnoActual++;
                turno = new Turno();
                procesaTurno(turnoActual, tiempoPedido, tiempoEntrega, nPaq, turnos, turno, paqxTurno);
            }
        }
        return true;
    }

    private static void procesaTurno(int turnoActual, int tiempoPedido, int tiempoEntrega, int nPaquetes, ArrayList<Turno> turnos, Turno turno, ArrayList<Integer> paqxTurno) {
        paqxTurno.set(turnoActual, paqxTurno.get(turnoActual) + nPaquetes);
        turno.setnPaquetes(turno.getnPaquetes() + nPaquetes);
        int nDivision = (tiempoPedido - turnoActual * 8 * 60) / 150; //150 minutos, 1/4 de turno
        DivisionTurno div = turno.getDivisiones()[nDivision];
        div.setnPaquetes(div.getnPaquetes() + nPaquetes);
        div.setRazonPaqTurno((((float) div.getnPaquetes()) / ((float) turno.getnPaquetes())));
        int cantPedidosPrioridad = 0;
        HashMap mapaPrioridades = div.getPrioridades();
        if (mapaPrioridades.containsKey(tiempoEntrega)) {
            cantPedidosPrioridad = (int) mapaPrioridades.get(tiempoEntrega);
        }
        cantPedidosPrioridad++;
        mapaPrioridades.put(tiempoEntrega, cantPedidosPrioridad);
    }

    static void generaArchivos(Pronostico pronostico) {
        Historico historico = Historico.getInstance();
        int idPedido = 177302;
        ArrayList<Integer> dias = new ArrayList<>();
        ArrayList<Integer> paquetesT1 = new ArrayList<>();
        ArrayList<Integer> paquetesT2 = new ArrayList<>();
        ArrayList<Integer> paquetesT3 = new ArrayList<>();
        ArrayList<Pedido> arrPedido = new ArrayList<>();

        for (int i = 0; i < historico.getDias().size(); i++) {
            dias.add(i + 1);
            ArrayList<Integer> paqxTurno = historico.getPaquetesxDiaxTurno().get(i);
            paquetesT1.add(paqxTurno.get(0));
            paquetesT2.add(paqxTurno.get(1));
            paquetesT3.add(paqxTurno.get(2));
        }

        PolynomialFitter pf1 = new PolynomialFitter(paquetesT1,2);
        Polynomial regresionTurno1 = pf1.getBestFit();

        PolynomialFitter pf2 = new PolynomialFitter(paquetesT2,2);
        Polynomial regresionTurno2 = pf2.getBestFit();

        PolynomialFitter pf3 = new PolynomialFitter(paquetesT3,2);
        Polynomial regresionTurno3 = pf3.getBestFit();

//        int dia17pronPolT1 = (int) regresionTurno1.getY(50);
//        int dia17pronPolT2 = (int) regresionTurno2.getY(50);
//        int dia17pronPolT3 = (int) regresionTurno3.getY(50);
//        int dia17realT1 = paquetesT1.get(50);
//        int dia17realT2 = paquetesT2.get(50);
//        int dia17realT3 = paquetesT3.get(50);
        
        //////////////////////////////////////////////////////////////////////////////////////////////////
        Random randomGenerator= new Random();
        int hora = 0;
        int minuto = 0;
        Calendar diaInicio = Calendar.getInstance();
        diaInicio.set(2012,4,17);
        Mapa.init(150, 100, "");
        //for para los dias
        String dia = String.valueOf(diaInicio.get(Calendar.DATE));
        String mes = String.valueOf(diaInicio.get(Calendar.MONTH)+1);
        String anho = String.valueOf(diaInicio.get(Calendar.YEAR));
        if (dia.length() == 1) {
            dia = '0' + dia;
        }
        if (mes.length() == 1) {
            mes = '0' + mes;
        }
        while (anho.length() > 4) {
            anho = '0' + anho;
        }
        
        for (int j = 0; j < historico.getDias().size(); j++) {
            diaInicio.set(Integer.parseInt(anho),Integer.parseInt(mes),Integer.parseInt(dia)+j,hora,minuto);
            
            for (int turno=0; turno<3;turno++){
            //Turno1
                hora=turno*8;
                minuto=0;
                double sumFactores= 0;    
                int numPaquetesturno=0;

                if (turno==0)numPaquetesturno=(int) regresionTurno1.getY(j);
                if (turno==1)numPaquetesturno=(int) regresionTurno2.getY(j);
                if (turno==2)numPaquetesturno=(int) regresionTurno3.getY(j);

                for (int i=0 + 4*turno;i<4*(turno + 1); i++){
                    sumFactores=sumFactores + historico.getDias().get(j).get(turno).getDivisiones()[i%4].getRazonPaqTurno();//razon de paquetes 1/4 turno 1 dia 1
                }

                for(int cuarto=0;cuarto<4;cuarto++){
                    double factor = historico.getDias().get(j).get(turno).getDivisiones()[cuarto].getRazonPaqTurno();
                    int numPaquetesCuarto= (int)(historico.getDias().get(j).get(turno).getDivisiones()[cuarto].getnPaquetes()*factor);
                    int paquetesRepartidos=0;
                    int numero;
                    for (;paquetesRepartidos<numPaquetesCuarto;){
                        if(numPaquetesCuarto - paquetesRepartidos > 1){
                            numero = randomGenerator.nextInt(numPaquetesCuarto - paquetesRepartidos - 1)+1;
                            }
                        else numero = 1;
                        if(numero > 50) numero = randomGenerator.nextInt(50)+1;
                        paquetesRepartidos=paquetesRepartidos+numero;
                        //temp = numero;
                        //numero = numPaquetesCuarto - numero;
                        int x= randomGenerator.nextInt(99)+1;
                        int y= randomGenerator.nextInt(149)+1;
                        if (x==45 && y==30){ x=40;y=30;}
                        HashMap mapeoPrioridad = historico.getDias().get(j).get(turno).getDivisiones()[cuarto].getPrioridades();
                                //factoresprioridad.get(cuarto + 4*turno);

                        int prio=0;
                        ArrayList arr = new ArrayList(5);
                        arr.add(1); arr.add(2);arr.add(4);arr.add(8);arr.add(24);
                        for (int k=0; k < 5; k++){
                            try{
                                int aux = (int)mapeoPrioridad.get(arr.get(k));
                            }
                            catch(Exception ex){
                                mapeoPrioridad.put(arr.get(k),0);
                            }
                        }
                        
                        while(arr.size()>0){
                            try{
                                if(arr.size() > 1)
                                    prio = randomGenerator.nextInt(arr.size()-1);
                                else prio = 0;
                            }
                            catch(Exception e){
                                //System.out.println(e.toString());
                            }
                            if((int)mapeoPrioridad.get(arr.get(prio)) > 0){
                                mapeoPrioridad.put(arr.get(prio), (int)mapeoPrioridad.get(arr.get(prio)) - 1);
                                prio = (int) arr.get(prio);
                                break;
                            }
                            else arr.remove(prio);
                        }                        
                        idPedido = idPedido + 1;
                        try{
                            if((int)mapeoPrioridad.get(prio) == 0)
                                prio = 24;
                        }catch(Exception e){
                            prio = 24;
                        }
                        Calendar diaPedido = Calendar.getInstance();
                        diaPedido.set(Integer.parseInt(anho),Integer.parseInt(mes),Integer.parseInt(dia),hora,minuto);
                        Pedido pedido = new Pedido(x,y,numero,prio,diaPedido,idPedido,"0");
                        if(numero >0)
                            arrPedido.add(pedido);
                        int tempMinuto= 2*60*numero/numPaquetesCuarto;
                        //diaPedido.add(Calendar.MINUTE, tempMinuto);
                        minuto=minuto+tempMinuto;
                        if ((int)minuto>=60){ hora++;minuto = minuto%60;}
                        if (hora>=((1+cuarto)*2 + 8*turno)) 
                            break;
                    }
                }
            }
            crearArchivos(arrPedido,diaInicio);
            arrPedido.clear();
        }
    }

    private static void crearArchivos(ArrayList<Pedido> arrPedido, Calendar diaInicio) {
        Random randomGenerator = new Random();
        int idCliente;
        String dia = String.valueOf(diaInicio.get(Calendar.DATE));
        String mes = String.valueOf(diaInicio.get(Calendar.MONTH)+1);
        String anho = String.valueOf(diaInicio.get(Calendar.YEAR));
        if (dia.length() == 1) {
            dia = '0' + dia;
        }
        if (mes.length() == 1) {
            mes = '0' + mes;
        }
        while (anho.length() > 4) {
            anho = '0' + anho;
        }
        
        BufferedReader r = null;
        try {
            URL rutaca = Pronostico.class.getProtectionDomain().getCodeSource().getLocation();
            String ruta = rutaca.toString().substring(6, rutaca.toString().length()-8) + "filesGenerados/";
            ruta = ruta.replaceAll("%20", " ");
            ruta += "dat" + anho + mes + dia + ".txt";
            File archivo=new File(ruta);
            if(archivo.exists()){
                archivo.delete();
                //archivo.deleteOnExit();
            }
            archivo=new File(ruta);
            FileWriter escribir=new FileWriter(archivo,true);
            for(int i = 0; i < arrPedido.size();i++){
                idCliente = randomGenerator.nextInt(411)+1;
                String linea = new String();
                String hora=new String();
                String minuto=new String();
                if(arrPedido.get(i).getHoraPedido()<10)
                    hora = "0" + arrPedido.get(i).getHoraPedido();
                else hora = arrPedido.get(i).getHoraPedido()+"";
                if(arrPedido.get(i).getMinutoPedido()<10)
                    minuto = "0" + arrPedido.get(i).getMinutoPedido();
                else minuto = arrPedido.get(i).getMinutoPedido()+"";
                linea = hora+":"+minuto+","+arrPedido.get(i).getDestino().getX()+","+arrPedido.get(i).getDestino().getY()+
                        ","+arrPedido.get(i).getDemanda()+","+idCliente+","+arrPedido.get(i).getPrioridad()+'\r'+'\n';           
                escribir.write(linea);
            }
            escribir.close();
            //String ruta = PacketTracker.getInstancia().getServletContext().getRealPath("") + "/WEB-INF/files/" + "dat" + anho + mes + dia + ".txt";
            //r = new BufferedReader(new FileReader(ruta));
        } catch (Exception ex) {
            //System.out.println(ex.toString());
        }        
    }
}
